#ifndef SERVOCLOCK_H
#define SERVOCLOCK_H

#include <string>
#include <vector>
#include <esp_log.h>
#include <esp_timer.h>
#include "time.h"
#include <ctime>
#include <iomanip>
#include <sstream>
#include <cstring>

class ServoClockManager {
public:
    ServoClockManager();
    ~ServoClockManager();

    // 设置显示模式：0:显示时间;1:显示年份;2:显示日期;3:显示秒针;4:显示笑脸
    void SetDisplayMode(int mode);

    // 获取显示模式：0:显示时间;1:显示年份;2:显示日期;3:显示秒针;4:显示笑脸
    int GetDisplayMode() { return m_dispmode;}

    // 获取倒计时结束通知
    bool GetDisplayCountdownFlag()
    {
        if (m_CountdownTotalSeconds < 0) {
            return true;
        }
        return false;
    }

    // 设置倒计时时间
    void SetCountDownTime(uint8_t minute, uint8_t second)
    {
        m_CountdownTotalSeconds = minute * 60 + second;
    }

    // 设置四则运算结果
    void SetCalculationResult(uint16_t data);

    // 设置免打扰时间
    void SetDonotDisturbTimePeriod(tm startTime, tm endTime)
    {
        m_sDonotDisturbTimePeriodStart = startTime;
        m_sDonotDisturbTimePeriodEnd = endTime;
    }

    // 设定维修模式
    void setMaintenanceMode(bool status);

protected:

    // 舵机控制函数
    // 参数1为舵机序号；
    // 参数2为控制值（0或1）
    void ControlServo(uint8_t x, uint8_t y);

    // 机械时钟两个数字显示控制
    // digit[4][7]指机械时钟圆点前后两个两位数字
    // dot1，2指机械时钟的上下两个圆点,0关闭，1打开
    void ControlDispClockDigit(uint8_t digit[][7], uint8_t dot1, uint8_t dot2);

    // disp time
    void DispTime(tm *local_time);

    // disp year
    void DispYear(tm *local_time);

    // disp date
    void DispDate(tm *local_time);

    // disp 秒
    void DispSeconds(tm *local_time);

    // 显示表情
    void DispEmote();

    // 显示倒计时
    void DispCountdown();

    void OnServoClockTimer();

    // 显示当前温度
    void DispCurrentTemp();

    // 显示当前湿度
    void DispCurreHntHumidity();

private:
    int m_dispmode;

    bool m_dispYearFlg;
    bool m_dispDateFlg;
    bool m_dispEmoteFlg;
    bool m_dispTimeFlg;
    esp_timer_handle_t clock_timer_handle_ = nullptr;
    uint8_t m_motor_ctrl_board_1[15][5];
    uint8_t m_motor_ctrl_board_2[15][5];
    uint8_t m_motor_ctrl_board_1_old[15][5];
    uint8_t m_motor_ctrl_board_2_old[15][5];

    int16_t m_CountdownTotalSeconds;

    tm m_sDonotDisturbTimePeriodStart;
    tm m_sDonotDisturbTimePeriodEnd;

    tm StringToTm(const std::string& timeStr) {
        tm timeStruct = {};
        std::istringstream ss(timeStr);
        ss >> std::get_time(&timeStruct, "%H:%M"); // 解析HH:MM格式
        if (ss.fail()) {
            memset(&timeStruct, 0, sizeof(tm)); // 解析失败时清零
        }
        return timeStruct;
    }
};
#endif